package controller;

import java.io.IOException;
import java.security.NoSuchAlgorithmException;
import java.sql.SQLException;
import java.util.Calendar;
import java.util.GregorianCalendar;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import model.Benutzer;
import model.Ebene;
import model.EbenenRepository;
import model.Gruppe;
import model.Stichtag;
import model.StichtagRepository;

/**
 * Diese Klasse dient zum anzeigen der Startseite beim Aufruf der URL. Hier wird
 * der Login durchgeführt und beim Vergessen des Passworts ausgeholfen.
 * Controller, die merken, dass der Client nicht eingeloggt ist und einen Login
 * erfordern, könnten zum Index weiterleiten.
 */
@WebServlet({ "/Index", "/index", "/index.html", "/Index.html", "/index.htm", "/Index.htm" })
public class Index extends SessionControll {

	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#HttpServlet()
	 */
	public Index() {
		super();

	}

	// TODO erklären dieser Methode
	/**
	 * @throws IOException
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		HttpSession session = request.getSession();

		if (session.getAttribute("email") == null
				|| session.getAttribute("email").equals("")) {
			try {
				
				//Alle bisherigen Stichtage laden
				StichtagRepository stichtagRepository = StichtagRepository.getInstance();
				
				
				Stichtag[] stichtage = stichtagRepository.toArray(new Stichtag[0]);
				request.setAttribute("stichtage", stichtage);
				EbenenRepository ebenenRepository = EbenenRepository.getInstance();
				Ebene[] laenge = ebenenRepository.toArray(new Ebene[0]);								//sicherstellen, dass Arrays nicht zu kurz werden
				Ebene[][] modulhandbuecherNachStichtag = new Ebene[stichtage.length][laenge.length]; 	//modulhandbücher vor Stichtag nach Stichtagen geordnet
				Ebene[] modulhandbuecher = new Ebene[laenge.length];
				Ebene[] roots = new Ebene[laenge.length];
				
				//alle root-Ebenen laden
				roots = ebenenRepository.getEbeneNachId(1);
							
				//alle Unterebenen, die dem jeweiligen Stichtag am nächsten liegen laden
				for(int j=0; j<stichtage.length; j++){
					if(roots[0].getUnterelement() != null){
						modulhandbuecher = roots[0].getUnterelement();	//Standardfall: älteste root-Ebene verwenden
					}
					for(int i=1; i<roots.length; i++){
						if (roots[i].getUnterelement() != null && roots[i].getErstellungszeit() <= stichtage[j].getStichtag() && roots[i].getErstellungszeit() >= roots[i-1].getErstellungszeit()) {
							modulhandbuecher = roots[i].getUnterelement();	//Unterelemente von root-Ebene vor Stichtag
						}
					}
					for(int k=0; k<modulhandbuecher.length; k++){
						modulhandbuecherNachStichtag[j][k] = ebeneVorStichtag(modulhandbuecher[k].getId(), stichtage[j].getStichtag());
					}
				}
					
				request.setAttribute("modulhandbuecherNachStichtag", modulhandbuecherNachStichtag);
				// von unten nach hier verschoben
				RequestDispatcher view;
				view = request.getRequestDispatcher("Index.jsp");
				view.forward(request, response);
				
			} catch (NullPointerException e1) {
				new helper.Logging("Fehler F001",e1.toString(), benutzerRepository.getBenutzerNachEmail((String) request.getSession().getAttribute("email")), (byte)1);
				response.sendRedirect("Fehler?weiterleitung=index.html&fehler=Es gab einen Fehler beim Datenzugriff! Bitte versuchen Sie es erneut oder kontaktieren Sie einen Administrator. (F001)");
			} catch (ClassNotFoundException e1) {
				new helper.Logging("Fehler F002",e1.toString(), benutzerRepository.getBenutzerNachEmail((String) request.getSession().getAttribute("email")), (byte)1);
				response.sendRedirect("Fehler?weiterleitung=index.html&fehler=Es konnte nicht auf die Datenbank zugegriffen werden! Bitte versuchen Sie es erneut oder kontaktieren Sie einen Administrator. (F002)");
			} catch (SQLException e1) {
				new helper.Logging("Fehler F003",e1.toString(), benutzerRepository.getBenutzerNachEmail((String) request.getSession().getAttribute("email")), (byte)1);
				response.sendRedirect("Fehler?weiterleitung=index.html&fehler=Es gab einen Datenbankfehler! Bitte versuchen Sie es erneut oder kontaktieren Sie einen Administrator. (F003)");
			}
			// RequestDispatcher view;
			// view = request.getRequestDispatcher("Index.jsp");
			// view.forward(request, response);
		} else {
			response.sendRedirect("AufgabenListe");
		}

	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		/*
		 * if(request.getParameter("download") != null){
		 * System.out.println("juhu"); String Modulhandbuch =
		 * request.getParameter("download"); File file = new
		 * File(Modulhandbuch+".pdf"); FileInputStream fileIn = new
		 * FileInputStream(file); ServletOutputStream out =
		 * response.getOutputStream(); byte[] outputByte = new byte[4096];
		 * //copy binary contect to output stream while(fileIn.read(outputByte,
		 * 0, 4096) != -1){ out.write(outputByte, 0, 4096); } fileIn.close();
		 * out.flush(); out.close(); }
		 */

		if (request.getParameter("logout") != null) {
			String logout = request.getParameter("logout");
			if (logout.equals("true")) {
				super.logout(request, response);
			}
			response.sendRedirect("index.html");
		}

		if (request.getParameter("email") != null) {
			try {
				String email = request.getParameter("email");
				String passwort = request.getParameter("passwort");
				Benutzer benutzer;
				benutzer = benutzerRepository.login(email,
						Benutzer.getHash(passwort));
				if (benutzer == null) {
					request.setAttribute("passwortfehler", "true");
					RequestDispatcher view;
					view = request.getRequestDispatcher("Index.jsp");
					view.forward(request, response);
				} else {
					HttpSession session = request.getSession();
					Gruppe[] rechte = gruppenRepository.getGruppe(benutzer.getId());
					session.setAttribute("email", benutzer.getEmail());
					session.setAttribute("user", new Integer( benutzer.getId()));
					for (int i = 0; i < rechte.length; i++) {
						if (rechte[i] != null) {
							
							switch (rechte[i].getId()) {
							case 1:
								session.setAttribute("verantwortlicher", "true");
								break;
							case 2:
								session.setAttribute("redakteur", "true");
								break;
							case 3:
								session.setAttribute("admin", "true");
								System.out.println("admin eingelogt");
								break;
							case 4:
								session.setAttribute("dezernat2", "true");
								System.out.println("dez2 eingelogt");
								break;
							}
						}
					}
					response.sendRedirect("AufgabenListe");
				}
			} catch (NullPointerException e) {
				new helper.Logging("Fehler F004",e.toString(), benutzerRepository.getBenutzerNachEmail((String) request.getSession().getAttribute("email")), (byte)1);
				response.sendRedirect("Fehler?weiterleitung=index.html&fehler=Das System wurde nicht korrekt geladen! Bitte versuchen Sie es erneut oder kontaktieren Sie einen Administrator. (F004)");
			} catch (NoSuchAlgorithmException e) {
				new helper.Logging("Fehler F005",e.toString(), benutzerRepository.getBenutzerNachEmail((String) request.getSession().getAttribute("email")), (byte)1);
				response.sendRedirect("Fehler?weiterleitung=index.html&fehler=Das System wurde nicht korrekt geladen! Bitte versuchen Sie es erneut oder kontaktieren Sie einen Administrator. (F005)");
			} catch (ClassNotFoundException e) {
				new helper.Logging("Fehler F006",e.toString(), benutzerRepository.getBenutzerNachEmail((String) request.getSession().getAttribute("email")), (byte)1);
				response.sendRedirect("Fehler?weiterleitung=index.html&fehler=Das System wurde nicht korrekt geladen! Bitte versuchen Sie es erneut oder kontaktieren Sie einen Administrator. (F006)");
			} catch (SQLException e) {
				new helper.Logging("Fehler F007",e.toString(), benutzerRepository.getBenutzerNachEmail((String) request.getSession().getAttribute("email")), (byte)1);
				response.sendRedirect("Fehler?weiterleitung=index.html&fehler=Das System wurde nicht korrekt geladen! Bitte versuchen Sie es erneut oder kontaktieren Sie einen Administrator. (F007)");
			}
		}
	}

	public static String getErstellungsjahr(long timestampInMSec) {
		GregorianCalendar cal = new GregorianCalendar();
		cal.setTimeInMillis(timestampInMSec);
		String year = "" + cal.get(Calendar.YEAR + Calendar.MONTH + Calendar.DAY_OF_MONTH);
		return year;
	}
	
	
	public static String getErstellungsdatum(long timestampInMSec) {
		GregorianCalendar cal = new GregorianCalendar();
		cal.setTimeInMillis(timestampInMSec);
		String date = "" + cal.get(Calendar.DAY_OF_MONTH) + "." + cal.get(Calendar.MONTH) +"."+cal.get(Calendar.YEAR);
		return date;
	}
	
	
	private Ebene ebeneVorStichtag(int ebenenId, long erstellungszeit) {
		Ebene[] ebenen = ebenenRepository.getEbeneNachId(ebenenId);
		Ebene ebeneVorStichtag = null;
		if (ebenen[0].getErstellungszeit() <= erstellungszeit && ebenen[0].getRedaktionszustand()==Ebene.ZUSTAND_AKZEPTIERT_BEIDE){
			ebeneVorStichtag = ebenen[0];
		}	
		for (int m = 0; m < ebenen.length - 1; m++) {
			if (ebenen[m + 1].getErstellungszeit() <= erstellungszeit && ebenen[m].getErstellungszeit() < ebenen[m + 1].getErstellungszeit() && ebenen[m+1].getRedaktionszustand()==Ebene.ZUSTAND_AKZEPTIERT_BEIDE) {
				ebeneVorStichtag = ebenen[m + 1];
			}
		}
		return ebeneVorStichtag;
	}
	
	
}
